@johnmorrisdotca/kyogijo-stadiums 0.45.2 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/NOTICE.md +9 -2
- package/dist/annotate.d.ts +1 -1
- package/dist/annotate.js +1 -1
- package/dist/areas.d.ts +4 -0
- package/dist/areas.js +33 -1
- package/dist/arenas-entry.d.ts +1 -0
- package/dist/arenas-entry.js +2 -0
- package/dist/athletics/describe.js +1 -1
- package/dist/athletics-entry.d.ts +1 -0
- package/dist/athletics-entry.js +2 -0
- package/dist/atlas-entry.d.ts +1 -0
- package/dist/atlas-entry.js +2 -0
- package/dist/ballpark.d.ts +1 -1
- package/dist/ballpark.js +1 -1
- package/dist/budo/describe.js +1 -1
- package/dist/budo-entry.d.ts +1 -0
- package/dist/budo-entry.js +2 -0
- package/dist/canvas-entry.d.ts +1 -0
- package/dist/canvas-entry.js +2 -0
- package/dist/charts-entry.d.ts +1 -0
- package/dist/charts-entry.js +2 -0
- package/dist/charts.athletics.js +1 -1
- package/dist/charts.baseball.js +1 -1
- package/dist/charts.curling.heat.js +1 -1
- package/dist/charts.curling.js +1 -1
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +1 -1
- package/dist/charts.network.js +1 -1
- package/dist/charts.pool.js +1 -1
- package/dist/charts.skating.js +1 -1
- package/dist/charts.soccer.js +1 -1
- package/dist/cityctx-entry.d.ts +1 -0
- package/dist/cityctx-entry.js +2 -0
- package/dist/cityctx.belmont-park.data.d.ts +3 -0
- package/dist/cityctx.belmont-park.data.js +1802 -0
- package/dist/cityctx.data.d.ts +10 -1
- package/dist/cityctx.data.js +11 -2
- package/dist/cityctx.js +19 -1
- package/dist/cityctx.meadowlands.data.d.ts +3 -0
- package/dist/cityctx.meadowlands.data.js +820 -0
- package/dist/cityctx.montreal-city.data.d.ts +3 -0
- package/dist/cityctx.montreal-city.data.js +2899 -0
- package/dist/cityctx.montreal-downtown.data.d.ts +3 -0
- package/dist/cityctx.montreal-downtown.data.js +3004 -0
- package/dist/cityctx.montreal-olympic.data.d.ts +3 -0
- package/dist/cityctx.montreal-olympic.data.js +2562 -0
- package/dist/cityctx.nyc-bronx.data.d.ts +3 -0
- package/dist/cityctx.nyc-bronx.data.js +1671 -0
- package/dist/cityctx.nyc-brooklyn.data.d.ts +3 -0
- package/dist/cityctx.nyc-brooklyn.data.js +3485 -0
- package/dist/cityctx.nyc-flushing.data.d.ts +3 -0
- package/dist/cityctx.nyc-flushing.data.js +865 -0
- package/dist/cityctx.nyc-midtown.data.d.ts +3 -0
- package/dist/cityctx.nyc-midtown.data.js +2438 -0
- package/dist/crowd.d.ts +22 -2
- package/dist/d3-entry.d.ts +1 -0
- package/dist/d3-entry.js +2 -0
- package/dist/district-entry.d.ts +2 -0
- package/dist/district-entry.js +4 -0
- package/dist/district-lean-entry.js +1 -1
- package/dist/district.js +2 -2
- package/dist/draw.js +3 -3
- package/dist/element-entry.d.ts +1 -0
- package/dist/element-entry.js +2 -0
- package/dist/eras-entry.d.ts +1 -0
- package/dist/eras-entry.js +2 -0
- package/dist/events.js +1 -1
- package/dist/flythrough-entry.d.ts +1 -0
- package/dist/flythrough-entry.js +2 -0
- package/dist/flythrough.dom.d.ts +2 -0
- package/dist/flythrough.dom.js +2 -2
- package/dist/frames-entry.d.ts +1 -0
- package/dist/frames-entry.js +2 -0
- package/dist/full.d.ts +1 -0
- package/dist/full.js +3 -1
- package/dist/geojson-entry.d.ts +1 -0
- package/dist/geojson-entry.js +2 -0
- package/dist/geometry-entry.d.ts +1 -0
- package/dist/geometry-entry.js +2 -0
- package/dist/grounds-entry.d.ts +1 -0
- package/dist/grounds-entry.js +2 -0
- package/dist/heat.js +1 -1
- package/dist/heat.zones.d.ts +1 -1
- package/dist/heat.zones.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -1
- package/dist/judging-entry.d.ts +1 -0
- package/dist/judging-entry.js +2 -0
- package/dist/judging.board.js +1 -1
- package/dist/judging.draw.js +1 -1
- package/dist/judging.js +1 -1
- package/dist/judging.text.js +1 -1
- package/dist/layers.env.d.ts +1 -1
- package/dist/layers.env.js +1 -1
- package/dist/layers.js +1 -1
- package/dist/layout.js +1 -1
- package/dist/layouts-entry.d.ts +1 -0
- package/dist/layouts-entry.js +2 -0
- package/dist/leagues-entry.d.ts +1 -0
- package/dist/leagues-entry.js +2 -0
- package/dist/mount-entry.d.ts +1 -0
- package/dist/mount-entry.js +2 -0
- package/dist/multi-entry.d.ts +1 -0
- package/dist/multi-entry.js +2 -0
- package/dist/multi.draw.js +1 -1
- package/dist/multi.js +1 -1
- package/dist/osm-entry.d.ts +1 -0
- package/dist/osm-entry.js +2 -0
- package/dist/outside.d.ts +2 -1
- package/dist/outside.js +7 -6
- package/dist/parks-entry.d.ts +1 -0
- package/dist/parks-entry.js +2 -0
- package/dist/plateau-entry.d.ts +1 -0
- package/dist/plateau-entry.js +2 -0
- package/dist/plot-entry.d.ts +1 -0
- package/dist/plot-entry.js +2 -0
- package/dist/png-entry.d.ts +1 -0
- package/dist/png-entry.js +2 -0
- package/dist/pool.replay.js +1 -1
- package/dist/pool.words.js +1 -1
- package/dist/ranges.js +1 -1
- package/dist/react-entry.d.ts +1 -0
- package/dist/react-entry.js +2 -0
- package/dist/replay-entry.d.ts +1 -0
- package/dist/replay-entry.js +2 -0
- package/dist/replay.d.ts +1 -1
- package/dist/replay.dom.js +1 -1
- package/dist/replay.js +1 -1
- package/dist/rules.js +1 -1
- package/dist/scene-entry.d.ts +1 -0
- package/dist/scene-entry.js +2 -0
- package/dist/situation.draw.js +1 -1
- package/dist/situation.js +1 -1
- package/dist/skating/describe.js +1 -1
- package/dist/skating-entry.d.ts +1 -0
- package/dist/skating-entry.js +2 -0
- package/dist/stadiums-entry.d.ts +1 -0
- package/dist/stadiums-entry.js +2 -0
- package/dist/stadiums.d.ts +35 -4
- package/dist/stadiums.data.js +60 -0
- package/dist/stadiums.js +31 -5
- package/dist/stadiums.osm.data.js +224 -2
- package/dist/strings.core.d.ts +1105 -0
- package/dist/strings.core.js +55 -0
- package/dist/strings.d.ts +4 -1084
- package/dist/strings.en.d.ts +2 -0
- package/dist/strings.en.js +537 -0
- package/dist/strings.ja.d.ts +2 -0
- package/dist/strings.ja.js +562 -0
- package/dist/strings.js +5 -1100
- package/dist/surfaces/venue.js +1 -1
- package/dist/target.js +1 -1
- package/dist/team.common.js +1 -1
- package/dist/team.formation.js +1 -1
- package/dist/team.lineup.js +1 -1
- package/dist/team.motion.js +1 -1
- package/dist/team.network.js +1 -1
- package/dist/team.shape.js +1 -1
- package/dist/turn-entry.d.ts +1 -0
- package/dist/turn-entry.js +2 -0
- package/dist/turn.kit.d.ts +14 -1
- package/dist/turn.kit.js +19 -0
- package/dist/turn.model.d.ts +1 -1
- package/dist/turn.model.js +1 -1
- package/dist/turn.style.js +16 -3
- package/dist/uprights.js +1 -1
- package/dist/venue-data-entry.d.ts +2 -0
- package/dist/venue-data-entry.js +5 -1
- package/dist/venue-data.d.ts +1 -1
- package/dist/venue-data.js +5 -2
- package/dist/venue.js +3 -1
- package/dist/venue.real.d.ts +45 -1
- package/dist/venue.real.js +225 -15
- package/dist/venues/amerant-bank-arena.data.d.ts +2 -0
- package/dist/venues/amerant-bank-arena.data.js +9 -0
- package/dist/venues/amerant-bank-arena.osm.data.d.ts +2 -0
- package/dist/venues/amerant-bank-arena.osm.data.js +47 -0
- package/dist/venues/american-airlines-center.data.d.ts +2 -0
- package/dist/venues/american-airlines-center.data.js +9 -0
- package/dist/venues/american-airlines-center.osm.data.d.ts +2 -0
- package/dist/venues/american-airlines-center.osm.data.js +57 -0
- package/dist/venues/ball-arena.data.d.ts +2 -0
- package/dist/venues/ball-arena.data.js +9 -0
- package/dist/venues/ball-arena.osm.data.d.ts +2 -0
- package/dist/venues/ball-arena.osm.data.js +63 -0
- package/dist/venues/bell-centre.data.d.ts +2 -0
- package/dist/venues/bell-centre.data.js +9 -0
- package/dist/venues/bell-centre.osm.data.d.ts +2 -0
- package/dist/venues/bell-centre.osm.data.js +24 -0
- package/dist/venues/benchmark-international-arena.data.d.ts +2 -0
- package/dist/venues/benchmark-international-arena.data.js +9 -0
- package/dist/venues/benchmark-international-arena.osm.data.d.ts +2 -0
- package/dist/venues/benchmark-international-arena.osm.data.js +57 -0
- package/dist/venues/bridgestone-arena.data.d.ts +2 -0
- package/dist/venues/bridgestone-arena.data.js +9 -0
- package/dist/venues/bridgestone-arena.osm.data.d.ts +2 -0
- package/dist/venues/bridgestone-arena.osm.data.js +43 -0
- package/dist/venues/canada-life-centre.data.d.ts +2 -0
- package/dist/venues/canada-life-centre.data.js +9 -0
- package/dist/venues/canada-life-centre.osm.data.d.ts +2 -0
- package/dist/venues/canada-life-centre.osm.data.js +35 -0
- package/dist/venues/canadian-tire-centre.data.d.ts +2 -0
- package/dist/venues/canadian-tire-centre.data.js +9 -0
- package/dist/venues/canadian-tire-centre.osm.data.d.ts +2 -0
- package/dist/venues/canadian-tire-centre.osm.data.js +45 -0
- package/dist/venues/capital-one-arena.data.d.ts +2 -0
- package/dist/venues/capital-one-arena.data.js +9 -0
- package/dist/venues/capital-one-arena.osm.data.d.ts +2 -0
- package/dist/venues/capital-one-arena.osm.data.js +22 -0
- package/dist/venues/climate-pledge-arena.data.d.ts +2 -0
- package/dist/venues/climate-pledge-arena.data.js +9 -0
- package/dist/venues/climate-pledge-arena.osm.data.d.ts +2 -0
- package/dist/venues/climate-pledge-arena.osm.data.js +32 -0
- package/dist/venues/crypto-com-arena.data.d.ts +2 -0
- package/dist/venues/crypto-com-arena.data.js +9 -0
- package/dist/venues/crypto-com-arena.osm.data.d.ts +2 -0
- package/dist/venues/crypto-com-arena.osm.data.js +64 -0
- package/dist/venues/delta-center.data.d.ts +2 -0
- package/dist/venues/delta-center.data.js +9 -0
- package/dist/venues/delta-center.osm.data.d.ts +2 -0
- package/dist/venues/delta-center.osm.data.js +40 -0
- package/dist/venues/enterprise-center.data.d.ts +2 -0
- package/dist/venues/enterprise-center.data.js +9 -0
- package/dist/venues/enterprise-center.osm.data.d.ts +2 -0
- package/dist/venues/enterprise-center.osm.data.js +35 -0
- package/dist/venues/grand-casino-arena.data.d.ts +2 -0
- package/dist/venues/grand-casino-arena.data.js +9 -0
- package/dist/venues/grand-casino-arena.osm.data.d.ts +2 -0
- package/dist/venues/grand-casino-arena.osm.data.js +37 -0
- package/dist/venues/honda-center.data.d.ts +2 -0
- package/dist/venues/honda-center.data.js +9 -0
- package/dist/venues/honda-center.osm.data.d.ts +2 -0
- package/dist/venues/honda-center.osm.data.js +46 -0
- package/dist/venues/keybank-center.data.d.ts +2 -0
- package/dist/venues/keybank-center.data.js +9 -0
- package/dist/venues/keybank-center.osm.data.d.ts +2 -0
- package/dist/venues/keybank-center.osm.data.js +34 -0
- package/dist/venues/lenovo-center.data.d.ts +2 -0
- package/dist/venues/lenovo-center.data.js +9 -0
- package/dist/venues/lenovo-center.osm.data.d.ts +2 -0
- package/dist/venues/lenovo-center.osm.data.js +51 -0
- package/dist/venues/little-caesars-arena.data.d.ts +2 -0
- package/dist/venues/little-caesars-arena.data.js +9 -0
- package/dist/venues/little-caesars-arena.osm.data.d.ts +2 -0
- package/dist/venues/little-caesars-arena.osm.data.js +64 -0
- package/dist/venues/madison-square-garden.data.d.ts +2 -0
- package/dist/venues/madison-square-garden.data.js +9 -0
- package/dist/venues/madison-square-garden.osm.data.d.ts +2 -0
- package/dist/venues/madison-square-garden.osm.data.js +47 -0
- package/dist/venues/nationwide-arena.data.d.ts +2 -0
- package/dist/venues/nationwide-arena.data.js +9 -0
- package/dist/venues/nationwide-arena.osm.data.d.ts +2 -0
- package/dist/venues/nationwide-arena.osm.data.js +50 -0
- package/dist/venues/ppg-paints-arena.data.d.ts +2 -0
- package/dist/venues/ppg-paints-arena.data.js +9 -0
- package/dist/venues/ppg-paints-arena.osm.data.d.ts +2 -0
- package/dist/venues/ppg-paints-arena.osm.data.js +31 -0
- package/dist/venues/prudential-center.data.d.ts +2 -0
- package/dist/venues/prudential-center.data.js +9 -0
- package/dist/venues/prudential-center.osm.data.d.ts +2 -0
- package/dist/venues/prudential-center.osm.data.js +41 -0
- package/dist/venues/rogers-arena.data.d.ts +2 -0
- package/dist/venues/rogers-arena.data.js +10 -0
- package/dist/venues/rogers-arena.osm.data.d.ts +2 -0
- package/dist/venues/rogers-arena.osm.data.js +27 -0
- package/dist/venues/rogers-place.data.d.ts +2 -0
- package/dist/venues/rogers-place.data.js +9 -0
- package/dist/venues/rogers-place.osm.data.d.ts +2 -0
- package/dist/venues/rogers-place.osm.data.js +40 -0
- package/dist/venues/sap-center.data.d.ts +2 -0
- package/dist/venues/sap-center.data.js +9 -0
- package/dist/venues/sap-center.osm.data.d.ts +2 -0
- package/dist/venues/sap-center.osm.data.js +54 -0
- package/dist/venues/scotiabank-arena.data.d.ts +2 -0
- package/dist/venues/scotiabank-arena.data.js +9 -0
- package/dist/venues/scotiabank-arena.osm.data.d.ts +2 -0
- package/dist/venues/scotiabank-arena.osm.data.js +45 -0
- package/dist/venues/scotiabank-saddledome.data.d.ts +2 -0
- package/dist/venues/scotiabank-saddledome.data.js +9 -0
- package/dist/venues/scotiabank-saddledome.osm.data.d.ts +2 -0
- package/dist/venues/scotiabank-saddledome.osm.data.js +46 -0
- package/dist/venues/t-mobile-arena.data.d.ts +2 -0
- package/dist/venues/t-mobile-arena.data.js +9 -0
- package/dist/venues/t-mobile-arena.osm.data.d.ts +2 -0
- package/dist/venues/t-mobile-arena.osm.data.js +50 -0
- package/dist/venues/td-garden.data.d.ts +2 -0
- package/dist/venues/td-garden.data.js +9 -0
- package/dist/venues/td-garden.osm.data.d.ts +2 -0
- package/dist/venues/td-garden.osm.data.js +24 -0
- package/dist/venues/ubs-arena.data.d.ts +2 -0
- package/dist/venues/ubs-arena.data.js +9 -0
- package/dist/venues/ubs-arena.osm.data.d.ts +2 -0
- package/dist/venues/ubs-arena.osm.data.js +33 -0
- package/dist/venues/united-center.data.d.ts +2 -0
- package/dist/venues/united-center.data.js +9 -0
- package/dist/venues/united-center.osm.data.d.ts +2 -0
- package/dist/venues/united-center.osm.data.js +56 -0
- package/dist/venues/xfinity-mobile-arena.data.d.ts +2 -0
- package/dist/venues/xfinity-mobile-arena.data.js +9 -0
- package/dist/venues/xfinity-mobile-arena.osm.data.d.ts +2 -0
- package/dist/venues/xfinity-mobile-arena.osm.data.js +47 -0
- package/dist/venues-entry.d.ts +1 -0
- package/dist/venues-entry.js +2 -0
- package/dist/venues.all.d.ts +1 -0
- package/dist/venues.all.js +6 -0
- package/dist/venues.d.ts +18 -6
- package/dist/venues.data.js +1 -1
- package/dist/venues.index.d.ts +8 -0
- package/dist/venues.index.js +34 -0
- package/dist/venues.js +45 -8
- package/dist/venues.osm.data.d.ts +0 -2
- package/dist/venues.osm.data.js +0 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/walk/vancouver.data.d.ts +2 -0
- package/dist/walk/vancouver.data.js +1291 -0
- package/dist/walk.d.ts +24 -1
- package/dist/walk.data.d.ts +2 -2
- package/dist/walk.data.js +13 -1293
- package/dist/walk.full.d.ts +1 -0
- package/dist/walk.full.js +5 -0
- package/dist/walk.index.d.ts +7 -0
- package/dist/walk.index.js +3 -0
- package/dist/walk.js +69 -7
- package/package.json +7 -2
package/dist/outside.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { districtRing, turnBy } from "./district.js";
|
|
6
6
|
import { FEET_PER_METRE } from "./geometry.js";
|
|
7
7
|
import { metresFrom } from "./venues.geo.js";
|
|
8
|
-
import {
|
|
9
|
-
import { WALK_IDS, walkIdFor, walkMask } from "./walk.js";
|
|
8
|
+
import { WALK_INDEX } from "./walk.index.js";
|
|
9
|
+
import { WALK_IDS, walkDataOf, walkIdFor, walkMask } from "./walk.js";
|
|
10
10
|
import { OUTSIDE_LEVELS, outsideCount } from "./outside.paint.js";
|
|
11
11
|
export { OUTSIDE_LEVELS, outsideCount };
|
|
12
12
|
/** The most people to a square metre of walkable ground in the list at 100 percent: a crowd standing close, short of a crush. */
|
|
@@ -166,11 +166,12 @@ export const maskIdOf = (plan) => walkIdFor(plan.members.map((m) => m.member.id)
|
|
|
166
166
|
/** Whether a plan has a crowd to show: some venue of it stands on a mask. */
|
|
167
167
|
export const hasOutside = (plan) => maskIdOf(plan) !== undefined;
|
|
168
168
|
/** The ids of the venues there is a walkable mask round. */
|
|
169
|
-
export const OUTSIDE_VENUES = Object.freeze([...new Set(WALK_IDS.flatMap((id) =>
|
|
169
|
+
export const OUTSIDE_VENUES = Object.freeze([...new Set(WALK_IDS.flatMap((id) => WALK_INDEX[id].venues.map((key) => key.split(":")[0])))]);
|
|
170
170
|
const placedCache = new WeakMap();
|
|
171
171
|
/**
|
|
172
172
|
* The crowd outside a plan's venues, in the plan's frame: the people of every venue of the plan that stands on a mask (each with its seats as the plan has them), worked out once and kept. `undefined` where no venue of the plan
|
|
173
|
-
* has a mask. The crowd is the same list whatever level is shown: `outsideCount` says how many of its first people stand at a level.
|
|
173
|
+
* has a mask. The crowd is the same list whatever level is shown: `outsideCount` says how many of its first people stand at a level. The district entry holds the data of every mask; the lean district holds a mask's data only after
|
|
174
|
+
* `loadOutside(venues)` has read it, and throws, saying so, where it is asked for a crowd before.
|
|
174
175
|
* @example
|
|
175
176
|
* ```ts
|
|
176
177
|
* import { planDistrict } from "@johnmorrisdotca/kyogijo-stadiums/district";
|
|
@@ -189,7 +190,7 @@ export function outsideCrowd(plan) {
|
|
|
189
190
|
placedCache.set(plan, null);
|
|
190
191
|
return undefined;
|
|
191
192
|
}
|
|
192
|
-
const data =
|
|
193
|
+
const data = walkDataOf(maskId);
|
|
193
194
|
const ids = data.venues.map((key) => key.split(":")[0]);
|
|
194
195
|
const present = ids.map((id) => plan.members.find((m) => m.member.id === id)).filter((m) => m !== undefined);
|
|
195
196
|
const extras = { buildings: data.venues.map((key) => metresFrom(data.origin, districtRing(key))), apron: 5 };
|
|
@@ -216,7 +217,7 @@ export function outsideCrowd(plan) {
|
|
|
216
217
|
}
|
|
217
218
|
/** Whether a point of the plan's frame (feet) is on the mask's walkable ground: the inverse of what `outsideCrowd` does to a person, for a test to hold the crowd to the mask. */
|
|
218
219
|
export function standsOnWalkable(plan, maskId, [fx, fy]) {
|
|
219
|
-
const data =
|
|
220
|
+
const data = walkDataOf(maskId);
|
|
220
221
|
const [shiftX, shiftY] = metresFrom(plan.origin, [data.origin])[0];
|
|
221
222
|
const [ux, uy] = turnBy([fx, fy], -plan.turn);
|
|
222
223
|
const mask = walkMask(maskId, { buildings: data.venues.map((key) => metresFrom(data.origin, districtRing(key))), apron: 5 });
|
package/dist/parks-entry.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "./strings.ts";
|
|
1
2
|
export { PARKS, PARK_IDS, fenceFor, parkById, parkByName, parkByWikidata, parkNameIn, parkOfficialName, parkPointsIn, parkQuirksIn, parkSourceUrl, parkUnit, parkWallsIn, parksByName } from "./parks.ts";
|
|
2
3
|
export { officialName, plainName } from "./names.ts";
|
|
3
4
|
export type { PlaceAlias, PlaceNameKind } from "./names.ts";
|
package/dist/parks-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// The ballparks: their fence distances, with the article each was read from.
|
|
2
|
+
// The words in both languages, as this entry has always carried them (the lean district reads one language when it is asked to).
|
|
3
|
+
import "./strings.js";
|
|
2
4
|
export { PARKS, PARK_IDS, fenceFor, parkById, parkByName, parkByWikidata, parkNameIn, parkOfficialName, parkPointsIn, parkQuirksIn, parkSourceUrl, parkUnit, parkWallsIn, parksByName } from "./parks.js";
|
|
3
5
|
export { officialName, plainName } from "./names.js";
|
package/dist/plateau-entry.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "./strings.ts";
|
|
1
2
|
export { PLATEAU_ATTRIBUTION, PLATEAU_AREAS, TOKYO_DOME_CITY } from "./plateau.data.ts";
|
|
2
3
|
export { CONTEXT_BLOCKS, CONTEXT_LANDMARK, CONTEXT_LANDMARK_REACH, CONTEXT_REACH, CONTEXT_TONES, decodeBuilding } from "./context.ts";
|
|
3
4
|
export type { ContextArea } from "./context.ts";
|
package/dist/plateau-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// The buildings round a district, from Project PLATEAU (MLIT's 3D city models of Japan), as data a district takes in its `context` option: Tokyo Dome City's, simplified and edited, under PLATEAU's terms, with their credit.
|
|
2
|
+
// The words in both languages, as this entry has always carried them (the lean district reads one language when it is asked to).
|
|
3
|
+
import "./strings.js";
|
|
2
4
|
export { PLATEAU_ATTRIBUTION, PLATEAU_AREAS, TOKYO_DOME_CITY } from "./plateau.data.js";
|
|
3
5
|
export { CONTEXT_BLOCKS, CONTEXT_LANDMARK, CONTEXT_LANDMARK_REACH, CONTEXT_REACH, CONTEXT_TONES, decodeBuilding } from "./context.js";
|
package/dist/plot-entry.d.ts
CHANGED
package/dist/plot-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// A drawing as a mark for Observable Plot, with Plot not imported.
|
|
2
2
|
import "./full.js";
|
|
3
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
4
|
+
import "./venues.all.js";
|
|
3
5
|
export { surfaceMark, surfaceScales } from "./plot.js";
|
package/dist/png-entry.d.ts
CHANGED
package/dist/png-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// A drawing as a PNG in Node, through the optional peer @resvg/resvg-js.
|
|
2
2
|
import "./full.js";
|
|
3
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
4
|
+
import "./venues.all.js";
|
|
3
5
|
export { PNG_PEER_MISSING, toPNG } from "./png.js";
|
package/dist/pool.replay.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// of the marks. Nothing here is a model of swimming: it is the splits the caller has, played back.
|
|
5
5
|
import { swimPlan } from "./pool.js";
|
|
6
6
|
import { formatTime } from "./pool.race.js";
|
|
7
|
-
import { KYOGIJO_STRINGS } from "./strings.js";
|
|
7
|
+
import { KYOGIJO_STRINGS } from "./strings.core.js";
|
|
8
8
|
const finite = (value) => Number.isFinite(value);
|
|
9
9
|
/** The progress of one row over a race of `distance` metres with a split every `every` metres. */
|
|
10
10
|
export function progressOf(row, distance, every, reaction) {
|
package/dist/pool.words.js
CHANGED
|
@@ -3,7 +3,7 @@ import { artisticPlan, divePlan, poloPlan, swimPlan, venueOf } from "./pool.js";
|
|
|
3
3
|
import { STATUS_TEXT, formatTime } from "./pool.race.js";
|
|
4
4
|
import { MEDALS } from "./pool.labels.js";
|
|
5
5
|
import { WATER_POLO } from "./pool.figures.js";
|
|
6
|
-
import { KYOGIJO_STRINGS, fill } from "./strings.js";
|
|
6
|
+
import { KYOGIJO_STRINGS, fill } from "./strings.core.js";
|
|
7
7
|
const trimmed = (value) => String(Math.round(value * 100) / 100);
|
|
8
8
|
/** The plan of a pool sport's options. */
|
|
9
9
|
export function planOf(o) {
|
package/dist/ranges.js
CHANGED
|
@@ -10,7 +10,7 @@ import { toSurface } from "./frames.js";
|
|
|
10
10
|
import "./frames.providers.js";
|
|
11
11
|
import { parseRange } from "./ranges.names.js";
|
|
12
12
|
import { frameSizeOf } from "./outline.js";
|
|
13
|
-
import { KYOGIJO_STRINGS, fill } from "./strings.js";
|
|
13
|
+
import { KYOGIJO_STRINGS, fill } from "./strings.core.js";
|
|
14
14
|
import { quarterTurn } from "./surfaces/surface.js";
|
|
15
15
|
import { convertLength } from "./units.js";
|
|
16
16
|
const round = (value) => String(Math.round(value * 100) / 100);
|
package/dist/react-entry.d.ts
CHANGED
package/dist/react-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// A helper for React that does not depend on it: props to spread onto a div, and a component made from the React you pass.
|
|
2
2
|
import "./full.js";
|
|
3
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
4
|
+
import "./venues.all.js";
|
|
3
5
|
export { createKyogijo, kyogijoHtml, kyogijoProps } from "./react.js";
|
package/dist/replay-entry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import "./full.ts";
|
|
2
|
+
import "./venues.all.ts";
|
|
2
3
|
export { activeEvents, describeEvent, drawFrame, eventsBetween, interpolate, possession, replayClock, replayEvents, replayInfo, replayLayers, replaySnapshot, replaySummary, replayTable, replayTimes, trails } from "./replay.ts";
|
|
3
4
|
export type { ReplaySnapshot } from "./replay.ts";
|
|
4
5
|
export { alongPool, distanceAt, progressOf, raceTimeline } from "./pool.replay.ts";
|
package/dist/replay-entry.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Replay: tracking data over time on a surface. The frame, the clock and the pure functions between them; the controls and the animation
|
|
2
2
|
// are in the mount (`mountKyogijo(...).replay(...)`) and in `<kyogijo-field>`.
|
|
3
3
|
import "./full.js";
|
|
4
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
5
|
+
import "./venues.all.js";
|
|
4
6
|
export { activeEvents, describeEvent, drawFrame, eventsBetween, interpolate, possession, replayClock, replayEvents, replayInfo, replayLayers, replaySnapshot, replaySummary, replayTable, replayTimes, trails } from "./replay.js";
|
|
5
7
|
export { alongPool, distanceAt, progressOf, raceTimeline } from "./pool.replay.js";
|
|
6
8
|
export { formatTime, parseTime } from "./pool.race.js";
|
package/dist/replay.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Layer } from "./layers.types.ts";
|
|
2
2
|
import type { ActiveEvent, Possession, ReplayEvent, ReplayLook, ReplayObject, ReplayTeam, ReplayTimeline, ReplayTrail } from "./replay.types.ts";
|
|
3
|
-
import { type KyogijoWords } from "./strings.ts";
|
|
3
|
+
import { type KyogijoWords } from "./strings.core.ts";
|
|
4
4
|
import type { Language, ScoreOptions, SurfaceOptions } from "./types.ts";
|
|
5
5
|
type P = [number, number];
|
|
6
6
|
/** Seconds as a clock, `0:12` or `1:05:09`. */
|
package/dist/replay.dom.js
CHANGED
|
@@ -5,7 +5,7 @@ import { num } from "./format.js";
|
|
|
5
5
|
import { renderLayers } from "./layers.js";
|
|
6
6
|
import { REPLAY_SPEEDS, createReplay } from "./replay.control.js";
|
|
7
7
|
import { describeEvent, drawFrame, replayClock, replayGroups, replaySpoken, replayInfo, replayPlacer, replaySnapshot } from "./replay.js";
|
|
8
|
-
import { KYOGIJO_STRINGS, fill } from "./strings.js";
|
|
8
|
+
import { KYOGIJO_STRINGS, fill } from "./strings.core.js";
|
|
9
9
|
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
10
10
|
let counter = 0;
|
|
11
11
|
/** The controls' stylesheet: written once beside the controls, scoped to them, in the page's own colours. */
|
package/dist/replay.js
CHANGED
|
@@ -7,7 +7,7 @@ import { drawKyogijo, describe } from "./draw.js";
|
|
|
7
7
|
import { esc, hash } from "./format.js";
|
|
8
8
|
import { envFor, place, unitOfLayer } from "./layers.env.js";
|
|
9
9
|
import { renderLayers } from "./layers.js";
|
|
10
|
-
import { KYOGIJO_STRINGS, fill } from "./strings.js";
|
|
10
|
+
import { KYOGIJO_STRINGS, fill } from "./strings.core.js";
|
|
11
11
|
import { VERSION } from "./version.js";
|
|
12
12
|
const TEAMS = ["home", "away", "ball", "puck", "official"];
|
|
13
13
|
const isNum = (value) => typeof value === "number" && Number.isFinite(value);
|
package/dist/rules.js
CHANGED
|
@@ -24,7 +24,7 @@ import { fenceFor, heldPark, parkWallsIn } from "./parks.core.js";
|
|
|
24
24
|
import { PARK_IDS_WITHOUT_WALLS } from "./parks.walls.js";
|
|
25
25
|
import { frameSizeOf, outlineOf } from "./outline.js";
|
|
26
26
|
import { soccerSpec } from "./surfaces/soccer-spec.js";
|
|
27
|
-
import { KYOGIJO_STRINGS } from "./strings.js";
|
|
27
|
+
import { KYOGIJO_STRINGS } from "./strings.core.js";
|
|
28
28
|
import { FEET_PER, isUnit } from "./units.js";
|
|
29
29
|
export { RULE_IDS } from "./rules.types.js";
|
|
30
30
|
const PICK = ["league", "year", "pitch", "park", "fence", "units", "sheet", "net", "field", "pool", "athletics", "skating"];
|
package/dist/scene-entry.d.ts
CHANGED
package/dist/scene-entry.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// A drawing as plain data: the shapes it is painted with, in order, their colours worked out for light or dark; and the SVG that needs no stylesheet.
|
|
2
2
|
import "./full.js";
|
|
3
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
4
|
+
import "./venues.all.js";
|
|
3
5
|
export { sceneFromSvg, sceneOf } from "./scene.js";
|
|
4
6
|
export { sceneToSvg } from "./scene.flat.js";
|
|
5
7
|
export { pathCommands } from "./scene.path.js";
|
package/dist/situation.draw.js
CHANGED
|
@@ -5,7 +5,7 @@ import { wideView } from "./annotate.js";
|
|
|
5
5
|
import { el, num } from "./format.js";
|
|
6
6
|
import { DRIVE_CODES, downTag, hockeyPill, yardLineText } from "./situation.js";
|
|
7
7
|
import { pillWidget, scorebugWidget, shootoutWidget, tagWidget } from "./situation.widgets.js";
|
|
8
|
-
import { KYOGIJO_STRINGS } from "./strings.js";
|
|
8
|
+
import { KYOGIJO_STRINGS } from "./strings.core.js";
|
|
9
9
|
import { roundedRect, textOn } from "./surfaces/surface.js";
|
|
10
10
|
/** A widget set where the eye wants it, upright however the surface lies. */
|
|
11
11
|
function put(widget, cx, cy, turned) {
|
package/dist/situation.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// team attacks, which end, what the words say), so that the drawing (`situation.draw.ts`, `situation.badge.ts`) and the description do not decide it twice. A value that is not what
|
|
3
3
|
// it should be (a fourth down on the CFL's field, 7 skaters, a clock that is not a time) is left out, as a value from a page's markup is anywhere else; nothing here throws.
|
|
4
4
|
import { attackingIn } from "./frames.js";
|
|
5
|
-
import { KYOGIJO_STRINGS, fill } from "./strings.js";
|
|
5
|
+
import { KYOGIJO_STRINGS, fill } from "./strings.core.js";
|
|
6
6
|
/** The most rounds of a shootout that are drawn. */
|
|
7
7
|
export const SHOOTOUT_MAX = 12;
|
|
8
8
|
/** The rounds that are regular: the rounds after them are sudden death. */
|
package/dist/skating/describe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// What a skating drawing says of itself: its sentence about the rink, and what the options mark on it. Cheap (it reads the options, not the plan), so that a title and a description cost nothing.
|
|
2
|
-
import { fill, KYOGIJO_STRINGS } from "../strings.js";
|
|
2
|
+
import { fill, KYOGIJO_STRINGS } from "../strings.core.js";
|
|
3
3
|
import { raceById } from "./events.js";
|
|
4
4
|
import { furnitureOf, racesOf, skatingLeague } from "./plan.js";
|
|
5
5
|
import { longOval } from "./track.js";
|
package/dist/skating-entry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import "./full.ts";
|
|
2
|
+
import "./venues.all.ts";
|
|
2
3
|
export { skatingPairs, skatingGrid, skatingResults, skatingReplay, figureElements, formatTime, distanceSkated } from "./charts.skating.ts";
|
|
3
4
|
export type { DrawTotals, ElementTotals, FigureElementsOptions, SkatingElement, SkatingEntry, SkatingPair, SkatingRaceOptions, SkatingReplay, SkatingReplayOptions, SkatingResult, SkatingResultsTotals, SkatingRunner, SkatingStarter } from "./charts.skating.ts";
|
|
4
5
|
export { ELEMENT_KINDS, ELEMENT_NAMES, LONG_TRACK_RACES, LONG_TRACK_RACE_IDS, RACES, RACE_IDS, SHORT_TRACK_RACES, SHORT_TRACK_RACE_IDS, raceById } from "./skating/events.ts";
|
package/dist/skating-entry.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// The ice skating rinks: the standard 400 m speed skating track, the short track oval and the figure skating rink, with the plan of each, the track's geometry (a point of a lane, the start of a race, the
|
|
2
2
|
// lap of the crossing), the races and the elements, and the data: the pairs of a race, the starting positions of a short track race, the results, a replay and the elements of a programme as marks.
|
|
3
3
|
import "./full.js";
|
|
4
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
5
|
+
import "./venues.all.js";
|
|
4
6
|
export { skatingPairs, skatingGrid, skatingResults, skatingReplay, figureElements, formatTime, distanceSkated } from "./charts.skating.js";
|
|
5
7
|
export { ELEMENT_KINDS, ELEMENT_NAMES, LONG_TRACK_RACES, LONG_TRACK_RACE_IDS, RACES, RACE_IDS, SHORT_TRACK_RACES, SHORT_TRACK_RACE_IDS, raceById } from "./skating/events.js";
|
|
6
8
|
export { disciplineOf, furnitureOf, racesOf, skatingLeague, skatingPlan } from "./skating/plan.js";
|
package/dist/stadiums-entry.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import "./full.ts";
|
|
2
|
+
import "./venues.all.ts";
|
|
2
3
|
export { VENUE_ATTRIBUTION, STADIUMS, STADIUM_IDS, groundOfStadium, planPark, planStadium, stadiumBowl, stadiumBowlInside, stadiumById, stadiumByWikidata, stadiumConfigOf, stadiumConfigs, stadiumFrameHeading, stadiumKind, stadiumNames, stadiumOrientation, stadiumSeats } from "./stadiums.ts";
|
|
3
4
|
export type { ParkPlan, RealStadium, RealStadiumData, StadiumBasis, StadiumConfigData, StadiumConfigId, StadiumKind, StadiumOrientation, StadiumOsm, StadiumPlan, StadiumRoof } from "./stadiums.ts";
|
package/dist/stadiums-entry.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// The real stadiums and ballparks: the outline of each building and the way its field lies (OpenStreetMap, ODbL 1.0) and a plausible bowl from the seats of each configuration, the bowls and the roof the sources give (Wikidata, Wikipedia).
|
|
2
2
|
import "./full.js";
|
|
3
|
+
// The real venues of the NHL's arenas, as this entry has always had them (the lean district reads the ones it shows).
|
|
4
|
+
import "./venues.all.js";
|
|
3
5
|
export { VENUE_ATTRIBUTION, STADIUMS, STADIUM_IDS, groundOfStadium, planPark, planStadium, stadiumBowl, stadiumBowlInside, stadiumById, stadiumByWikidata, stadiumConfigOf, stadiumConfigs, stadiumFrameHeading, stadiumKind, stadiumNames, stadiumOrientation, stadiumSeats } from "./stadiums.js";
|
package/dist/stadiums.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { VENUE_ATTRIBUTION } from "./venues.ts";
|
|
|
5
5
|
export { VENUE_ATTRIBUTION };
|
|
6
6
|
/** How a fact is known: `documented` is what a source cited with it says; `plausible` is ours, for a bowl no source describes. */
|
|
7
7
|
export type StadiumBasis = "documented" | "plausible";
|
|
8
|
-
/** The configurations of a stadium: the field the seats are counted for. `cfl` and `nfl` are the football fields of the two leagues, `soccer` a soccer pitch, `mlb` a baseball field, `boxing` a boxing ring in a hall. */
|
|
9
|
-
export type StadiumConfigId = "cfl" | "nfl" | "soccer" | "mlb" | "boxing";
|
|
8
|
+
/** The configurations of a stadium: the field the seats are counted for. `cfl` and `nfl` are the football fields of the two leagues, `soccer` a soccer pitch, `mlb` a baseball field, `boxing` a boxing ring in a hall, `nba` a basketball court in a hall (an arena that stages basketball, Barclays Center). */
|
|
9
|
+
export type StadiumConfigId = "cfl" | "nfl" | "soccer" | "mlb" | "boxing" | "nba";
|
|
10
10
|
/** What a stadium is: a `stadium` has a football field and a soccer pitch lying along its length, a `park` is a baseball park, whose frame is home plate's, a `hall` is a hall with a ring in the middle and the seats round it. */
|
|
11
11
|
export type StadiumKind = "stadium" | "park" | "hall";
|
|
12
12
|
/**
|
|
@@ -60,6 +60,7 @@ export interface RealStadiumData {
|
|
|
60
60
|
looks?: {
|
|
61
61
|
ivyWalls?: string;
|
|
62
62
|
dirtInfield?: string;
|
|
63
|
+
brickWalls?: string;
|
|
63
64
|
};
|
|
64
65
|
configs: Partial<Record<StadiumConfigId, StadiumConfigData>>;
|
|
65
66
|
/** The seats of the whole bowl where it holds more than a configuration's (Lumen Field's soccer seats are fewer: the upper sections are closed): the bowl is fitted to these and a configuration opens its seats from the lowest bowl up. */
|
|
@@ -80,6 +81,14 @@ export interface RealStadiumData {
|
|
|
80
81
|
};
|
|
81
82
|
read: string;
|
|
82
83
|
};
|
|
84
|
+
/** A tower that leans over the stadium (the Olympic Stadium's Montreal Tower): its height and its inclination, as the article gives them. The tower's footprint is `StadiumOsm.tower`. */
|
|
85
|
+
tower?: {
|
|
86
|
+
height: number;
|
|
87
|
+
unit: "m";
|
|
88
|
+
angle: number;
|
|
89
|
+
basis: StadiumBasis;
|
|
90
|
+
read: string;
|
|
91
|
+
};
|
|
83
92
|
/** The building's lower band, a podium under the concourse levels: its height in feet and how it is known (ours where the sources do not say). */
|
|
84
93
|
facade?: {
|
|
85
94
|
podium: number;
|
|
@@ -87,6 +96,15 @@ export interface RealStadiumData {
|
|
|
87
96
|
basis: StadiumBasis;
|
|
88
97
|
read: string;
|
|
89
98
|
};
|
|
99
|
+
/** A tower standing apart from the bowl, `endTower` (Lumen Field's, at the open north end): the storeys the article gives, and ours (`plausible`) the height in metres, the footprint in metres, and how far it stands along the field's axis from the middle of the pitch, in metres (positive towards the heading of the axis). */
|
|
100
|
+
endTower?: {
|
|
101
|
+
storeys: number;
|
|
102
|
+
height: number;
|
|
103
|
+
size: [number, number];
|
|
104
|
+
along: number;
|
|
105
|
+
basis: StadiumBasis;
|
|
106
|
+
read: string;
|
|
107
|
+
};
|
|
90
108
|
roof: {
|
|
91
109
|
kind: StadiumRoof;
|
|
92
110
|
basis: StadiumBasis;
|
|
@@ -137,9 +155,22 @@ export interface StadiumOsm {
|
|
|
137
155
|
canopies?: {
|
|
138
156
|
source: string;
|
|
139
157
|
height: number;
|
|
140
|
-
rise: number;
|
|
158
|
+
rise: number; /** OpenStreetMap's `roof:shape` where the roof has one (`round` for Lumen Field's two). */
|
|
159
|
+
shape?: string;
|
|
141
160
|
ring: [number, number][];
|
|
142
161
|
}[];
|
|
162
|
+
/**
|
|
163
|
+
* The tower OpenStreetMap maps beside the building, where the stadium has one (`RealStadiumData.tower`): its footprint (the tower's shaft seen from above, with its base) as `[longitude, latitude]`, the height OpenStreetMap
|
|
164
|
+
* maps for it in metres, and the two ends of its axis worked out from them: the base, the footprint's point farthest from the middle of the building, and the top, 165 m up, which lies over the building (the shaft leans over
|
|
165
|
+
* it at the inclination the article gives, so its top is that many metres from the base, towards the middle of the building).
|
|
166
|
+
*/
|
|
167
|
+
tower?: {
|
|
168
|
+
source: string;
|
|
169
|
+
height: number;
|
|
170
|
+
ring: [number, number][];
|
|
171
|
+
base: [number, number];
|
|
172
|
+
top: [number, number];
|
|
173
|
+
};
|
|
143
174
|
/** The building's outline as `[longitude, latitude]`, not repeating its first point. */
|
|
144
175
|
ring: [number, number][];
|
|
145
176
|
/**
|
|
@@ -191,7 +222,7 @@ export declare function stadiumNames(stadium: RealStadium): {
|
|
|
191
222
|
export declare const stadiumFrameHeading: (stadium: RealStadium) => number;
|
|
192
223
|
/** How the field lies in a stadium's building (see `StadiumOsm.axis`). */
|
|
193
224
|
export declare const stadiumOrientation: (stadium: RealStadium) => StadiumOrientation;
|
|
194
|
-
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb` or `
|
|
225
|
+
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb`, `boxing` or `nba`, or `undefined` for a sport a stadium has no configuration for. */
|
|
195
226
|
export declare const stadiumConfigOf: (sport: string | undefined) => StadiumConfigId | undefined;
|
|
196
227
|
/** The seats of a stadium for a configuration (0 for one it has none of). */
|
|
197
228
|
export declare const stadiumSeats: (stadium: RealStadium, config: StadiumConfigId) => number;
|
package/dist/stadiums.data.js
CHANGED
|
@@ -22,6 +22,7 @@ export const STADIUM_DATA = [
|
|
|
22
22
|
"wikidataSeats": [67000, 72000],
|
|
23
23
|
"tiers": { "count": 3, "basis": "documented", "read": "the article names the lower concourse levels, the club and suite levels and the Summit levels above them" },
|
|
24
24
|
"roof": { "kind": "canopy", "basis": "documented", "cover": 0.7, "read": "the article: a roof of 200,000 square feet that covers 70 percent of the seats and leaves the field open, spanning 720 feet between concrete pylons at the north and south ends" },
|
|
25
|
+
"endTower": { "storeys": 13, "height": 46, "size": [12, 12], "along": 85, "basis": "plausible", "read": "the article: a 13-story tower at the north end, with a vertical scoreboard and the Hawks' Nest bleachers at its base; the storeys are the article's, and the height (46 metres, a storey of 3.5 metres), the footprint (12 by 12 metres), the place (85 metres north of the pitch's middle, on its axis, where the end is open) and the scoreboard's size on its face are ours (no source gives them)" },
|
|
25
26
|
},
|
|
26
27
|
{
|
|
27
28
|
"id": "t-mobile-park",
|
|
@@ -29,6 +30,7 @@ export const STADIUM_DATA = [
|
|
|
29
30
|
"wikidata": "Q1193117",
|
|
30
31
|
"park": "t-mobile-park",
|
|
31
32
|
"en": { "title": "T-Mobile Park", "revision": 1379419810 },
|
|
33
|
+
"looks": { "brickWalls": "the brief (John's, 2026-10-22): the ballpark's facade is brick; the English article does not say so, so it is drawn as a wall in a brick tone, nothing more (no courses, no arches)" },
|
|
32
34
|
"configs": { "mlb": { "sport": "mlb", "seats": 47368, "source": "wikipedia", "read": "the infobox's capacity for baseball, 47,368" } },
|
|
33
35
|
"wikidataSeats": [47476],
|
|
34
36
|
"tiers": { "count": 4, "basis": "documented", "tierSeats": { "lower": 20521, "upper": 22075, "bleachers": 3666 }, "read": "the article's levels: the Main Level of 20,521 seats (most of the lower bowl), the Club Level of 4,123, the Suite Level of 2,050 and the View Level of 15,902, and two bleacher sections of 3,666" },
|
|
@@ -72,4 +74,62 @@ export const STADIUM_DATA = [
|
|
|
72
74
|
"tiers": { "count": 1, "basis": "documented", "read": "the Japanese article: the stands are on one level, the largest of a one-level stand in Japan, the infield stand's 50 rows 14.3 metres high" },
|
|
73
75
|
"roof": { "kind": "open", "basis": "documented", "read": "the English article: the outfield is natural grass and open to the air, no roof over the grounds; the Ginsan roof over the grandstand behind home plate is not drawn" },
|
|
74
76
|
},
|
|
77
|
+
{
|
|
78
|
+
"id": "yankee-stadium",
|
|
79
|
+
"kind": "park",
|
|
80
|
+
"wikidata": "Q753529",
|
|
81
|
+
"park": "yankee-stadium",
|
|
82
|
+
"en": { "title": "Yankee Stadium", "revision": 1382714435 },
|
|
83
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 46537, "source": "wikipedia", "read": "the infobox's capacity for baseball, 46,537 (2020 on; earlier seasons 47,309 to 50,291), the article's own figure for seats, with standing room 52,325; Wikidata's capacity (49,642) is the figure of 2014" } },
|
|
84
|
+
"wikidataSeats": [49642],
|
|
85
|
+
"tiers": { "count": 2, "basis": "documented", "read": "the article: the Field Level and Main Level are the lower bowl, with the suites on the H&R Block Level, and the Upper Level and Grandstand Level the upper bowl; bleacher seats beyond the outfield fences" },
|
|
86
|
+
"roof": { "kind": "open", "basis": "plausible", "read": "the article speaks of a roof only as the support of the top deck's cantilevers and its lighting, with a frieze along the upper deck; nothing says that anything covers the field or the lower bowl, so the drawing is open to the air and leaves the upper deck's roof out" },
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "citi-field",
|
|
90
|
+
"kind": "park",
|
|
91
|
+
"wikidata": "Q1072882",
|
|
92
|
+
"park": "citi-field",
|
|
93
|
+
"en": { "title": "Citi Field", "revision": 1381363029 },
|
|
94
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 41922, "source": "wikipedia", "read": "the infobox's capacity for baseball, 41,922 (2012 on; 41,800 in 2009 to 2011), which Wikidata's capacity (P1083) also gives" } },
|
|
95
|
+
"wikidataSeats": [41922],
|
|
96
|
+
"tiers": { "count": 3, "basis": "plausible", "read": "the article names the Field, the Excelsior and the Promenade levels and says restaurants and clubs are on every level; three bowls are drawn from those names (ours: it does not count them)" },
|
|
97
|
+
"roof": { "kind": "open", "basis": "documented", "read": "the article: the preliminary model of 1998 had a retractable roof and a movable grass field; the ballpark as built has no roof, and the drawing is open to the air" },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "metlife-stadium",
|
|
101
|
+
"kind": "stadium",
|
|
102
|
+
"wikidata": "Q10862290",
|
|
103
|
+
"ground": "metlife-stadium",
|
|
104
|
+
"gridiron": "nfl",
|
|
105
|
+
"en": { "title": "MetLife Stadium", "revision": 1381185974 },
|
|
106
|
+
"configs": { "nfl": { "sport": "nfl", "seats": 82500, "source": "wikipedia", "read": "the infobox's capacity, 82,500, for both the Giants' and the Jets' games, which Wikidata's capacity (P1083) also gives" }, "soccer": { "sport": "soccer", "seats": 80663, "source": "wikipedia", "read": "the infobox's capacity for the 2026 world cup of soccer, 80,663, 1,837 fewer than its first (the renovation of the lower bowl that widened the field for the tournament)" } },
|
|
107
|
+
"bowlSeats": 82500,
|
|
108
|
+
"wikidataSeats": [82500],
|
|
109
|
+
"tiers": { "count": 3, "basis": "documented", "lowerSeats": 33346, "read": "the article's table of the seating bowl: a lower bowl of 33,346 seats, a mid-bowl of 21,323 and an upper bowl of 27,897" },
|
|
110
|
+
"roof": { "kind": "open", "basis": "documented", "read": "the article: MetLife Stadium does not have a roof, as proposals to include one failed over a dispute for funding" },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "olympic-stadium-montreal",
|
|
114
|
+
"kind": "park",
|
|
115
|
+
"wikidata": "Q285467",
|
|
116
|
+
"park": "olympic-stadium-montreal",
|
|
117
|
+
"en": { "title": "Olympic Stadium (Montreal)", "revision": 1382141337 },
|
|
118
|
+
"configs": { "mlb": { "sport": "mlb", "seats": 49757, "source": "wikipedia", "read": "the infobox's capacity for baseball, 49,757 (1992 on, after 12,000 seats were taken out and home plate moved closer to the stands in the renovations of 1991); Wikidata's capacity (45,757) is kept beside it" } },
|
|
119
|
+
"wikidataSeats": [45757],
|
|
120
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source read says how many seating levels there are: a lower and an upper bowl are drawn, the usual for a stadium of 50,000 seats (ours)" },
|
|
121
|
+
"roof": { "kind": "fixed", "basis": "documented", "read": "the article: the Kevlar roof, which could retract, was removed in May 1998 and a $26 million non-retractable opaque blue roof was installed later that year; a doughnut-shaped permanent ring is the roof's permanent component" },
|
|
122
|
+
"tower": { "height": 165, "unit": "m", "angle": 45, "basis": "documented", "read": "the article: the Montreal Tower, 165 m high, the tallest inclined structure in the world, inclined at 45 degrees and built into the north base of the stadium, from which the cables of the roof were hung; OpenStreetMap maps the building's outline and the same 165 m height, the observatory at its top (a viewpoint) and, as the part of the funicular line that rides on the tower (tagged above ground, its tunnel below), the line of the shaft from its foot to its top: that is 158 m across for 165 m of height, the article's 45 degrees. The slight curve of the shaft and its widths are ours." },
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "barclays-center",
|
|
126
|
+
"kind": "hall",
|
|
127
|
+
"wikidata": "Q807966",
|
|
128
|
+
"names": { "en": "Barclays Center", "ja": "バークレイズ・センター" },
|
|
129
|
+
"en": { "title": "Barclays Center", "revision": 1380399342 },
|
|
130
|
+
"configs": { "nba": { "sport": "nba", "seats": 17732, "source": "wikipedia", "read": "the infobox's capacity for basketball, 17,732, which Wikidata's capacity (P1083) also gives (hockey 15,795, which the NHL's Islanders used until 2020)" } },
|
|
131
|
+
"wikidataSeats": [17732],
|
|
132
|
+
"tiers": { "count": 2, "basis": "plausible", "read": "no source read says how many seating levels there are: a lower and an upper bowl are drawn, the usual for an arena of 17,700 seats (ours)" },
|
|
133
|
+
"roof": { "kind": "fixed", "basis": "documented", "read": "the article speaks of the arena's green roof (an ironworker was killed installing it in 2015) and of a weathering-steel latticework in three articulated bands; the roof is fixed" },
|
|
134
|
+
},
|
|
75
135
|
];
|
package/dist/stadiums.js
CHANGED
|
@@ -55,8 +55,8 @@ const lonLat = (ring) => ring.map(([lon, lat]) => [lon, lat]);
|
|
|
55
55
|
export const stadiumFrameHeading = (stadium) => (stadiumKind(stadium) === "park" ? (stadium.osm.axis.heading + 90) % 360 : stadium.osm.axis.heading);
|
|
56
56
|
/** How the field lies in a stadium's building (see `StadiumOsm.axis`). */
|
|
57
57
|
export const stadiumOrientation = (stadium) => ({ heading: stadium.osm.axis.heading, basis: stadium.osm.axis.basis, north: round(northOn(stadiumFrameHeading(stadium))) });
|
|
58
|
-
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb` or `
|
|
59
|
-
export const stadiumConfigOf = (sport) => (sport === "cfl" || sport === "nfl" || sport === "soccer" || sport === "mlb" || sport === "boxing" ? sport : undefined);
|
|
58
|
+
/** The configuration a sport is: `cfl`, `nfl`, `soccer`, `mlb`, `boxing` or `nba`, or `undefined` for a sport a stadium has no configuration for. */
|
|
59
|
+
export const stadiumConfigOf = (sport) => (sport === "cfl" || sport === "nfl" || sport === "soccer" || sport === "mlb" || sport === "boxing" || sport === "nba" ? sport : undefined);
|
|
60
60
|
/** The seats of a stadium for a configuration (0 for one it has none of). */
|
|
61
61
|
export const stadiumSeats = (stadium, config) => stadium.configs[config]?.seats ?? 0;
|
|
62
62
|
/**
|
|
@@ -168,6 +168,17 @@ export function planStadium(stadium, config, box) {
|
|
|
168
168
|
mine.set(key, made);
|
|
169
169
|
return made;
|
|
170
170
|
}
|
|
171
|
+
/** A tower of a stadium, in the drawing's frame: its outline (a rectangle with its sides along the field's axes), its height in feet and the direction its scoreboard looks, along an axis, towards the middle of the field. */
|
|
172
|
+
function endTowerOf(tower, heading, middle, place, at) {
|
|
173
|
+
const [dx, dy] = turnedTo(heading, [Math.sin((heading * Math.PI) / 180), Math.cos((heading * Math.PI) / 180)]);
|
|
174
|
+
const c = [middle[0] + dx * tower.along, middle[1] + dy * tower.along];
|
|
175
|
+
const [hw, hh] = [tower.size[0] / 2, tower.size[1] / 2];
|
|
176
|
+
const ring = place([[c[0] - hw, c[1] - hh], [c[0] + hw, c[1] - hh], [c[0] + hw, c[1] + hh], [c[0] - hw, c[1] + hh]]);
|
|
177
|
+
const [mx, my] = [(ring[0][0] + ring[2][0]) / 2, (ring[0][1] + ring[2][1]) / 2];
|
|
178
|
+
const [fx, fy] = [at[0] - mx, at[1] - my];
|
|
179
|
+
const face = Math.abs(fx) >= Math.abs(fy) ? [Math.sign(fx), 0] : [0, Math.sign(fy)];
|
|
180
|
+
return { ring, height: round(tower.height * FEET_PER_METRE), face };
|
|
181
|
+
}
|
|
171
182
|
function plan(stadium, config, rink) {
|
|
172
183
|
const orientation = stadiumOrientation(stadium);
|
|
173
184
|
const origin = middleOf(lonLat(stadium.osm.ring));
|
|
@@ -292,9 +303,11 @@ function plan(stadium, config, rink) {
|
|
|
292
303
|
const mapped = roof?.height === undefined ? 0 : round((roof.height - (roof.rise ?? 0)) * FEET_PER_METRE);
|
|
293
304
|
const edge = stadium.roof.kind === "canopy" ? round(top + CANOPY_CLEARANCE) : Math.max(mapped, top + STADIUM_CLEARANCE);
|
|
294
305
|
const cable = stadium.roof.kind === "cable" && opening !== undefined && rise > 0;
|
|
295
|
-
const canopies = stadium.roof.kind === "canopy" && stadium.osm.canopies !== undefined ? stadium.osm.canopies.map((c) => ({ ring: place(turned(c.ring)), low: round((c.height - c.rise) * FEET_PER_METRE), rise: round(c.rise * FEET_PER_METRE) })) : undefined;
|
|
306
|
+
const canopies = stadium.roof.kind === "canopy" && stadium.osm.canopies !== undefined ? stadium.osm.canopies.map((c) => ({ ring: place(turned(c.ring)), low: round((c.height - c.rise) * FEET_PER_METRE), rise: round(c.rise * FEET_PER_METRE), ...(c.shape === undefined ? {} : { shape: c.shape }) })) : undefined;
|
|
296
307
|
const north = orientation.basis === "none" ? undefined : orientation.north;
|
|
297
308
|
const room = north === undefined ? 0 : NORTH_ROOM;
|
|
309
|
+
// A tower apart from the bowl: a box `along` metres from the middle of the pitch on its axis, its scoreboard on the face that looks at the field.
|
|
310
|
+
const towers = stadium.endTower === undefined ? undefined : [endTowerOf(stadium.endTower, orientation.heading, middle, place, at)];
|
|
298
311
|
const bowl = {
|
|
299
312
|
rings: closing.rings,
|
|
300
313
|
...(closing.sectors.length === 0 ? {} : { closedSectors: closing.sectors }),
|
|
@@ -304,12 +317,13 @@ function plan(stadium, config, rink) {
|
|
|
304
317
|
footprint,
|
|
305
318
|
hall: { ...outer, x0: outer.x0 - HALL, y0: outer.y0 - HALL, x1: outer.x1 + HALL, y1: outer.y1 + HALL, r: outer.r + HALL },
|
|
306
319
|
...(north === undefined ? {} : { north }),
|
|
307
|
-
roof: cable ? "cable" : canopies === undefined ? "fixed" : "canopy",
|
|
320
|
+
roof: cable ? "cable" : canopies === undefined ? (stadium.roof.kind === "open" ? "open" : "fixed") : "canopy",
|
|
308
321
|
edge,
|
|
309
322
|
...(cable ? { crown: { rise, opening } } : {}),
|
|
310
323
|
...(stadium.facade === undefined ? {} : { podium: stadium.facade.podium }),
|
|
311
324
|
...(cable && stadium.roof.masts !== undefined ? { masts: { count: stadium.roof.masts.count, height: round(stadium.roof.masts.height * FEET_PER_METRE) } } : {}),
|
|
312
325
|
...(canopies === undefined ? {} : { canopies }),
|
|
326
|
+
...(towers === undefined ? {} : { towers }),
|
|
313
327
|
},
|
|
314
328
|
};
|
|
315
329
|
return { stadium, config, orientation, box: rink, footprint, opening, bowl, seats: rings.map((ring) => ({ tier: ring.tier, seats: ring.seats })), total, open, seatArea, fit: tight ? "tight" : "fits" };
|
|
@@ -325,6 +339,9 @@ const PARK_PLANS = new WeakMap();
|
|
|
325
339
|
const PARK_COVER = 0.92;
|
|
326
340
|
/** How far an open-air ballpark's walls stand over its top row, in feet (ours). */
|
|
327
341
|
const OPEN_WALL_OVER = 6;
|
|
342
|
+
/** How far a fixed roof's crown stands over its rim, in feet, and the width of a leaning tower's shaft at its base and at its top, in feet (ours: the sources give a roof's kind and a tower's height, not these). */
|
|
343
|
+
const FIXED_CROWN = 30;
|
|
344
|
+
const TOWER_WIDTH = [240, 64];
|
|
328
345
|
const PARK_PARKED = 0.3;
|
|
329
346
|
/**
|
|
330
347
|
* The plan of a ballpark from what its stands are laid from (`input`: the park's fence, the backstop and the crowd): the usual stands with each band as deep as its seats need, the building's outline turned so that home
|
|
@@ -392,7 +409,7 @@ function park(stadium, input) {
|
|
|
392
409
|
const room = north === undefined ? 0 : NORTH_ROOM;
|
|
393
410
|
const hall = { kind: "rrect", x0: fb.x0 - 30, y0: fb.y0 - 30, x1: fb.x1 + 30, y1: fb.y1 + 30, r: 0 };
|
|
394
411
|
const top = Math.max(...stands.rings.map((r) => r.height[1]));
|
|
395
|
-
const ivy = stadium.looks?.ivyWalls === undefined ? {} : { ivy: true };
|
|
412
|
+
const ivy = stadium.looks?.ivyWalls === undefined ? (stadium.looks?.brickWalls === undefined ? {} : { brick: true }) : { ivy: true };
|
|
396
413
|
let shell;
|
|
397
414
|
if (stadium.roof.kind === "dome") {
|
|
398
415
|
// An air-supported roof: the membrane over the outline OpenStreetMap maps for it, standing at the height of its rim (the building's height less the roof's own rise) and rising to the building's height.
|
|
@@ -403,6 +420,15 @@ function park(stadium, input) {
|
|
|
403
420
|
const low = round((mapped.height - mapped.rise) * FEET_PER_METRE);
|
|
404
421
|
shell = { footprint, hall, ...(north === undefined ? {} : { north }), roof: "dome", edge: low, wall: low, dome: { rim, low, crown: round(mapped.height * FEET_PER_METRE) }, ...ivy };
|
|
405
422
|
}
|
|
423
|
+
else if (stadium.roof.kind === "fixed") {
|
|
424
|
+
// A fixed roof over the whole bowl (the Olympic Stadium's): a low lens over the outline, from the walls (a little over the top row) to a crown a little higher over the middle (ours: the sources say the roof is fixed, not what shape it has),
|
|
425
|
+
// and the tower that leans over it where OpenStreetMap maps one.
|
|
426
|
+
const low = round(Math.max(top + STADIUM_CLEARANCE, (stadium.osm.height ?? 0) * FEET_PER_METRE));
|
|
427
|
+
const rim = footprint.map((p) => [c[0] + (p[0] - c[0]) * 0.98, c[1] + (p[1] - c[1]) * 0.98]);
|
|
428
|
+
const mapped = stadium.osm.tower;
|
|
429
|
+
const tower = mapped === undefined || stadium.tower === undefined ? undefined : { base: frameOf(metresFrom(origin, [mapped.base])[0]), top: frameOf(metresFrom(origin, [mapped.top])[0]), height: round(stadium.tower.height * FEET_PER_METRE), angle: stadium.tower.angle, width: [TOWER_WIDTH[0], TOWER_WIDTH[1]] };
|
|
430
|
+
shell = { footprint, hall, ...(north === undefined ? {} : { north }), roof: "dome", edge: low, wall: low, dome: { rim, low, crown: low + FIXED_CROWN }, ...(tower === undefined ? {} : { tower }), ...ivy };
|
|
431
|
+
}
|
|
406
432
|
else if (stadium.roof.kind === "open") {
|
|
407
433
|
// No roof: the walls stand a little over the top row.
|
|
408
434
|
const wall = round(Math.max(top + OPEN_WALL_OVER, (stadium.osm.height ?? 0) * FEET_PER_METRE));
|