aboutsummaryrefslogtreecommitdiff
path: root/engine/entities/place.ts
blob: 8ec1f9b0641201d9d8f9d5e0563ba549e49b6823 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import type { BaseEntity, PersonId, PlaceId } from '@hollowdark/engine/entities/base'

export type PlaceType = 'region' | 'city' | 'neighborhood' | 'specific_location'

/**
 * Cultural character of a region or city — drives event textures,
 * stereotypes, attitudes. Open-ended because cultures differ on many axes;
 * specific named attributes live alongside this via content references.
 */
export interface CultureDescriptor {
  readonly dominantFaithId: string | null
  readonly cosmopolitanism: number
  readonly conservatism: number
  readonly hospitality: number
  readonly tags: readonly string[]
}

export interface ClimateDescriptor {
  readonly latitudeBand: 'tropical' | 'temperate' | 'continental' | 'arid' | 'alpine' | 'tundra'
  readonly summerSeverity: number
  readonly winterSeverity: number
  readonly rainfall: number
  readonly notes: string
}

export interface EconomicCharacter {
  readonly primaryIndustries: readonly string[]
  readonly inequality: number
  readonly prosperity: number
}

export interface PoliticalCharacter {
  readonly form: 'democracy' | 'mixed' | 'authoritarian' | 'oligarchy' | 'other'
  readonly stability: number
  readonly currentTensions: readonly string[]
}

export interface Place extends BaseEntity<PlaceId, 'place'> {
  readonly name: string
  readonly type: PlaceType
  readonly parentPlaceId: PlaceId | null

  readonly culture: CultureDescriptor | null
  readonly climate: ClimateDescriptor | null
  readonly economy: EconomicCharacter | null
  readonly politics: PoliticalCharacter | null

  readonly population: number

  readonly ownerId: PersonId | null
  readonly currentResidents: readonly PersonId[]
  readonly propertyValue: number | null
}